package classes_0907;

/**
 * 1.普通代码块：在方法中(成员/静态)都可直接使用{}称之为普通代块
 * 普通代码块，普通代码块中定义的局部变量，作用域就是普通代码块，出了{}就被销毁
 *
 * 2.构造块：直接在类中，不加任何关键字直接使用{}称之为构造块
 * 优先于构造方法执行，每当产生该类对象时，就会调用一次构造块
 * 编译之后的class文件会将所有的构造块和构造方法融为一体，构造代码块写在原构造方法的代码上部
 *
 * 3.静态块：直接定义在类中，使用关键词static修饰的代码块称之为静态块
 * 静态代码块在类加载时执行，无论有多少对象产生，只会执行一次，优先于构造块（构造方法）
 * 在主类中的静态代码块优先于主方法执行（主方法在主类中，要调用方法，首先得加载主类！一加载主类静态代码块就会执行）
 *
 * 4.同步代码块:定义在方法中，使用关键字synchronized修饰的代码块称之为同步代码块
 */
public class CodeBlock {
    int age;
    String name;

    public CodeBlock(int age, String name) {
        System.out.println("1.类中的构造方法");
        this.age = age;
        this.name = name;
    }
    //直接在类中，使用{}括起来，不加任何修饰的代码块称之为构造块
    {
        System.out.println("2.类中的构造代码块");
        age=18;
        name="小奶";
    }

    //主类中的静态块
    static {
        System.out.println("3.主类静态代码块");
    }
    public static void main(String[] args) {
//        //1.普通代码块，直接定义在方法中，使用{}括起来的代码
//        {
//            //普通代码块，普通代码块中定义的局部变量，作用域就是普通代码块，出了{}就被销毁
//            int a=10;
//            System.out.println(a);
//        }
//        //2.构造块
//        CodeBlock codeBlock1=new CodeBlock(19,"小野");
//        System.out.println(codeBlock1.name+codeBlock1.age);
//        CodeBlock codeBlock2=new CodeBlock(19,"小乖");
//        System.out.println(codeBlock2.name+codeBlock1.age);

        //3.外部类的静态块
        StaticBlock staticBlock1=new StaticBlock();
        StaticBlock staticBlock2=new StaticBlock();

        //主类的静态块
        System.out.println("4.主方法执行前");
        CodeBlock codeBlock3=new CodeBlock(19,"小野");
        CodeBlock codeBlock4=new CodeBlock(19,"小野");
        System.out.println("5.主方法执行结束");

    }
}
class StaticBlock{
    public StaticBlock() {
        System.out.println("7.无参构造方法");
    }
    {
        System.out.println("8.构造块");
    }
    static {
        System.out.println("9.静态代码块");
    }
}
